// -*- C++ -*-
/*!
 * @file  SoundDetection4RoIS.h
 * @brief Sound Detection Component for RoIS Framework
 * @date  $Date$
 *
 * $Id$
 */

#ifndef SOUNDDETECTION4ROIS_H
#define SOUNDDETECTION4ROIS_H

#include <rtm/Manager.h>
#include <rtm/DataFlowComponentBase.h>
#include <rtm/CorbaPort.h>
#include <rtm/DataInPort.h>
#include <rtm/DataOutPort.h>
#include <rtm/idl/BasicDataTypeSkel.h>
#include <rtm/idl/ExtendedDataTypesSkel.h>
#include <rtm/idl/InterfaceDataTypesSkel.h>

///////////////////// Additional Part /////////////////////
#include "RoIS_Component_Entity.h"

// Service implementation headers
// <rtc-template block="service_impl_h">

// </rtc-template>

// Service Consumer stub headers
// <rtc-template block="consumer_stub_h">

// </rtc-template>

using namespace RTC;

/*!
 * @class SoundDetection4RoIS
 * @brief Sound Detection Component for RoIS Framework
 *
 */
class SoundDetection4RoIS
  : public RTC::DataFlowComponentBase
{
 public:
  /*!
   * @brief constructor
   * @param manager Maneger Object
   */
  SoundDetection4RoIS(RTC::Manager* manager);

  /*!
   * @brief destructor
   */
  ~SoundDetection4RoIS();

  // <rtc-template block="public_attribute">
  
  // </rtc-template>

  // <rtc-template block="public_operation">
  
  // </rtc-template>

  /***
   *
   * The initialize action (on CREATED->ALIVE transition)
   * formaer rtc_init_entry() 
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
   virtual RTC::ReturnCode_t onInitialize();

  /***
   *
   * The finalize action (on ALIVE->END transition)
   * formaer rtc_exiting_entry()
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
   virtual RTC::ReturnCode_t onFinalize();

  /***
   *
   * The startup action when ExecutionContext startup
   * former rtc_starting_entry()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onStartup(RTC::UniqueId ec_id);

  /***
   *
   * The shutdown action when ExecutionContext stop
   * former rtc_stopping_entry()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onShutdown(RTC::UniqueId ec_id);

  /***
   *
   * The activated action (Active state entry action)
   * former rtc_active_entry()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
   virtual RTC::ReturnCode_t onActivated(RTC::UniqueId ec_id);

  /***
   *
   * The deactivated action (Active state exit action)
   * former rtc_active_exit()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
   virtual RTC::ReturnCode_t onDeactivated(RTC::UniqueId ec_id);

  /***
   *
   * The execution action that is invoked periodically
   * former rtc_active_do()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onExecute(RTC::UniqueId ec_id);

  /***
   *
   * The aborting action when main logic error occurred.
   * former rtc_aborting_entry()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onAborting(RTC::UniqueId ec_id);

  /***
   *
   * The error action in ERROR state
   * former rtc_error_do()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onError(RTC::UniqueId ec_id);

  /***
   *
   * The reset action that is invoked resetting
   * This is same but different the former rtc_init_entry()
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onReset(RTC::UniqueId ec_id);
  
  /***
   *
   * The state update action that is invoked after onExecute() action
   * no corresponding operation exists in OpenRTm-aist-0.2.0
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onStateUpdate(RTC::UniqueId ec_id);

  /***
   *
   * The action that is invoked when execution context's rate is changed
   * no corresponding operation exists in OpenRTm-aist-0.2.0
   *
   * @param ec_id target ExecutionContext Id
   *
   * @return RTC::ReturnCode_t
   * 
   * 
   */
  // virtual RTC::ReturnCode_t onRateChanged(RTC::UniqueId ec_id);


 protected:
  // <rtc-template block="protected_attribute">
  
  // </rtc-template>

  // <rtc-template block="protected_operation">
  
  // </rtc-template>

  // DataInPort declaration
  // <rtc-template block="inport_declare">
  
  // </rtc-template>


  // DataOutPort declaration
  // <rtc-template block="outport_declare">
  
  // </rtc-template>

  // CORBA Port declaration
  // <rtc-template block="corbaport_declare">
  
  // </rtc-template>

  // Service declaration
  // <rtc-template block="service_declare">
  
  // </rtc-template>

  // Consumer declaration
  // <rtc-template block="consumer_declare">
  
  // </rtc-template>

 private:
  // <rtc-template block="private_attribute">
  
  // </rtc-template>

  // <rtc-template block="private_operation">
  
  // </rtc-template>

///////////////////// Additional Part /////////////////////
public:
	RoIS_Component_Entity* m_pComponent;

	/**
	 * Callback Functions from RoIS HRI Engine
	 */
	SoundDetectionCore* m_core;
	RoIS_Core_Callback* m_pCoreCallback;

	/**
	 * For RoIS System Interface
	 */

	/**
	 * For RoIS Command Interface
	 */
	RoIS::ReturnCode_t bind();
	RoIS::ReturnCode_t release();
	RoIS::ReturnCode_t get_parameter(
		RoIS::ParameterList& parameters
	);
	RoIS::ReturnCode_t set_parameter(
		const RoIS::ParameterList& parameters,
		const char* command_id
	);
	RoIS::ReturnCode_t execute(
		const char* command_type,
		const RoIS::ArgumentList& arguments,
		const char* command_id
	);

	/**
	 * For RoIS Query Interface
	 */
	RoIS::ReturnCode_t query(
		const char* query_type,
		const char* condition,
		RoIS::ResultList& results
	);

	/**
	 * For RoIS Event Interface
	 */
	RoIS::ReturnCode_t subscribe(
		const char* event_type,
		const char* condition,
		const char* subscribe_id
	);
	RoIS::ReturnCode_t unsubscribe(
		const char* subscribe_id
	);

	/**
	 * For RoIS Engine Interface
	 */
	bool connect();
	bool disconnect();
	void receive_error(
		RoIS::ErrorType error_type,
		rois::ParameterList* results
	);
	void completed(
		const char* command_id,
		RoIS::Completed_Status status,
		rois::ParameterList* results
	);
	void receive_event(
		const char* event_type,
		const char* subscribe_id,
		rois::ParameterList* results
	);

	/**
	 * For Debug Message
	 */
	void showDebugMessage(
		string strMessage
	);

	/**
	 * For Core
	 */
	void start_core();
};


extern "C"
{
  DLL_EXPORT void SoundDetection4RoISInit(RTC::Manager* manager);
};

#endif // SOUNDDETECTION4ROIS_H
